﻿Imports System.Runtime.CompilerServices

Namespace Extensions

    Public Module DateTimeExtensions

        ''' <summary>
        ''' Преобразует значение текущего объекта <see cref="DateTime" /> в эквивалентное ему короткое строковое представление даты.
        ''' </summary>
        ''' <param name="base">Экземпляр <see cref="DateTime" />, который расширяется данным методом.</param>
        ''' <param name="todayName">Строковое представление текущего дня. Например, "Сегодня".</param>
        ''' <returns>Строка, содержащая короткое строковое представление даты текущего объекта <see cref="DateTime" />.</returns>
        ''' <remarks></remarks>
        <Extension>
        Public Function ToShortDateString(base As DateTime, todayName As String) As String
            Return ToShortDateString(base, todayName, base.ToShortDateString, base.ToShortDateString)
        End Function

        ''' <summary>
        ''' Преобразует значение текущего объекта <see cref="DateTime" /> в эквивалентное ему короткое строковое представление даты.
        ''' </summary>
        ''' <param name="base">Экземпляр <see cref="DateTime" />, который расширяется данным методом.</param>
        ''' <param name="todayName">Строковое представление текущего дня. Например, "Сегодня".</param>
        ''' <param name="yesterdayName">Строковое представление предыдущего дня. Например, "Вчера".</param>
        ''' <returns>Строка, содержащая короткое строковое представление даты текущего объекта <see cref="DateTime" />.</returns>
        ''' <remarks></remarks>
        <Extension>
        Public Function ToShortDateString(base As DateTime, todayName As String, yesterdayName As String) As String
            Return ToShortDateString(base, todayName, yesterdayName, base.ToShortDateString)
        End Function

        ''' <summary>
        ''' Преобразует значение текущего объекта <see cref="DateTime" /> в эквивалентное ему короткое строковое представление даты.
        ''' </summary>
        ''' <param name="base">Экземпляр <see cref="DateTime" />, который расширяется данным методом.</param>
        ''' <param name="todayName">Строковое представление текущего дня. Например, "Сегодня".</param>
        ''' <param name="yesterdayName">Строковое представление предыдущего дня. Например, "Вчера".</param>
        ''' <param name="tomorrowName">Строковое представление следующего дня. Например, "Завтра".</param>
        ''' <returns>Строка, содержащая короткое строковое представление даты текущего объекта <see cref="DateTime" />.</returns>
        ''' <remarks></remarks>
        <Extension>
        Public Function ToShortDateString(base As DateTime, todayName As String, yesterdayName As String, tomorrowName As String) As String
            Select Case base.Date.Subtract(Date.Today).Days
                Case 1
                    Return tomorrowName
                Case 0
                    Return todayName
                Case -1
                    Return yesterdayName
                Case Else
                    Return base.ToShortDateString
            End Select
        End Function

        ''' <summary>
        ''' Преобразует значение текущего объекта <see cref="DateTime" /> в эквивалентное ему длинное строковое представление даты.
        ''' </summary>
        ''' <param name="base">Экземпляр <see cref="DateTime" />, который расширяется данным методом.</param>
        ''' <param name="todayName">Строковое представление текущего дня. Например, "Сегодня".</param>
        ''' <returns>Строка, содержащая длинное строковое представление даты текущего объекта <see cref="DateTime" />.</returns>
        ''' <remarks></remarks>
        <Extension>
        Public Function ToLongDateString(base As DateTime, todayName As String) As String
            Return ToLongDateString(base, todayName, base.ToLongDateString, base.ToLongDateString)
        End Function

        ''' <summary>
        ''' Преобразует значение текущего объекта <see cref="DateTime" /> в эквивалентное ему длинное строковое представление даты.
        ''' </summary>
        ''' <param name="base">Экземпляр <see cref="DateTime" />, который расширяется данным методом.</param>
        ''' <param name="todayName">Строковое представление текущего дня. Например, "Сегодня".</param>
        ''' <param name="yesterdayName">Строковое представление предыдущего дня. Например, "Вчера".</param>
        ''' <returns>Строка, содержащая длинное строковое представление даты текущего объекта <see cref="DateTime" />.</returns>
        ''' <remarks></remarks>
        <Extension>
        Public Function ToLongDateString(base As DateTime, todayName As String, yesterdayName As String) As String
            Return ToLongDateString(base, todayName, yesterdayName, base.ToLongDateString)
        End Function

        ''' <summary>
        ''' Преобразует значение текущего объекта <see cref="DateTime" /> в эквивалентное ему длинное строковое представление даты.
        ''' </summary>
        ''' <param name="base">Экземпляр <see cref="DateTime" />, который расширяется данным методом.</param>
        ''' <param name="todayName">Строковое представление текущего дня. Например, "Сегодня".</param>
        ''' <param name="yesterdayName">Строковое представление предыдущего дня. Например, "Вчера".</param>
        ''' <param name="tomorrowName">Строковое представление следующего дня. Например, "Завтра".</param>
        ''' <returns>Строка, содержащая длинное строковое представление даты текущего объекта <see cref="DateTime" />.</returns>
        ''' <remarks></remarks>
        <Extension>
        Public Function ToLongDateString(base As DateTime, todayName As String, yesterdayName As String, tomorrowName As String) As String
            Select Case base.Date.Subtract(Date.Today).Days
                Case 1
                    Return tomorrowName
                Case 0
                    Return todayName
                Case -1
                    Return yesterdayName
                Case Else
                    Return base.ToLongDateString
            End Select
        End Function

    End Module

End Namespace
